Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

""" 

Book: Building RESTful Python Web Services 

Chapter 8: Testing and Ddeploying an API with Flask 

Author: Gaston C. Hillar - Twitter.com/gastonhillar 

Publisher: Packt Publishing Ltd. - http://www.packtpub.com 

""" 

from flask import url_for 

from flask import current_app 

 

 

class PaginationHelper(): 

def __init__(self, request, query, resource_for_url, key_name, schema): 

self.request = request 

self.query = query 

self.resource_for_url = resource_for_url 

self.key_name = key_name 

self.schema = schema 

self.results_per_page = current_app.config['PAGINATION_PAGE_SIZE'] 

self.page_argument_name = current_app.config['PAGINATION_PAGE_ARGUMENT_NAME'] 

 

def paginate_query(self): 

# If no page number is specified, we assume the request wants page #1 

page_number = self.request.args.get(self.page_argument_name, 1, type=int) 

paginated_objects = self.query.paginate( 

page_number, 

per_page=self.results_per_page, 

error_out=False) 

objects = paginated_objects.items 

if paginated_objects.has_prev: 

previous_page_url = url_for( 

self.resource_for_url, 

page=page_number-1, 

_external=True) 

else: 

previous_page_url = None 

if paginated_objects.has_next: 

next_page_url = url_for( 

self.resource_for_url, 

page=page_number+1, 

_external=True) 

else: 

next_page_url = None 

dumped_objects = self.schema.dump(objects, many=True).data 

return ({ 

self.key_name: dumped_objects, 

'previous': previous_page_url, 

'next': next_page_url, 

'count': paginated_objects.total 

})